#ifndef CODIGOS_H
#define CODIGOS_H

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "ManejadorBits.h"
#include "vector_binario.h"

/* ********************************************************************
 *                		 PRIMITIVAS DE CODIGOS						  *
 * ********************************************************************/

/* **************************** UNARIO ********************************/
/* Agrega 'num' codificado en unario al final del vector binario
 * pasado por parámetro. */
void cod_unario (vector_binario_t* vec, long num);

/* Devuelve un vector binario con 'num' codificado en unario o NULL en
 * caso de error. */
vector_binario_t* cod_unario_nuevo (long num);

/* Devuelve el numero que representa el vector del codigo unario.*/
long cod_unario_decimal(vector_binario_t* vec);

long cod_unario_leer (ManejadorBits_t* manejador);

/* **************************** BINARIO *******************************/
/* Agrega 'num' codificado en binario con la cantidad de bits especificada
 * al final del vector binario pasado por parámetro. */
void cod_binario (vector_binario_t* vec, long num, int bits);

/* Devuelve un vector binario con 'num' codificado en binario con la
 * cantidad de bits especificada o NULL en caso de error. */
vector_binario_t* cod_binario_nuevo (long num, int bits);

/* Devuelve el numero que representa el vector del codigo binario.*/
long cod_binario_decimal(vector_binario_t* vec);
 
 
long cod_binario_leer (ManejadorBits_t* manejador, long cantidad);

/* **************************** GAMMA *********************************/
/* Agrega 'num' codificado en gamma al final del vector binario
 * pasado por parámetro. */
void cod_gamma (vector_binario_t* vec, long num);

/* Devuelve un vector binario con 'num' codificado en gamma o NULL en
 * caso de error. */
vector_binario_t* cod_gamma_nuevo (long num);

/* Devuelve el numero que representa el vector del codigo gamma.*/
long cod_gamma_decimal(vector_binario_t* vec);

long cod_gamma_leer (ManejadorBits_t* manejador );
/* **************************** DELTA *********************************/
/* Agrega 'num' codificado en delta al final del vector binario
 * pasado por parámetro. */
void cod_delta (vector_binario_t* vec, long num);

/* Devuelve un vector binario con 'num' codificado en delta o NULL en
 * caso de error. */
vector_binario_t* cod_delta_nuevo (long num);

/* Devuelve el numero que representa el vector del codigo delta.*/
long cod_delta_decimal(vector_binario_t* vec);

long cod_delta_leer (ManejadorBits_t* manejador);

#endif //CODIGOS_H
